﻿#include "QTextReader.h"
#include "CommonFunction.h"
#include <QRegularExpression>

namespace pst
{
    QString processLine(const QString& line) {
        // 将制表符、空格和逗号等所有分隔符统一替换为一个逗号  
        QString processedLine = line;

        // 替换制表符和空格为逗号  
        processedLine.replace(QRegularExpression("[\\t\\s]+"), ","); // 替换制表符和空格为逗号  
        // 替换其他分隔符（包括逗号）为逗号  
        processedLine.replace(QRegularExpression("[,]+"), ",");      // 将多个逗号替换为一个  

        // 去掉首尾的空格和逗号  
        processedLine = processedLine.replace(QRegularExpression("^[,]+|[,]+$"), "").trimmed();
        return processedLine;
    }

    QTextReader::QTextReader(QObject* parent)
        : QObject(parent)
        , m_headers{}
        , m_filePath{}
        , m_splitter{ "," }
        , m_allData{}
        , m_isHirf2D{ false }
        , m_hasHeader{ false }
    {

    }

    void QTextReader::setHasHeader(bool hasHeader)
    {
        m_hasHeader = hasHeader;
    }

    void QTextReader::setHirf2DFormart(bool isHirf2D)
    {
        m_isHirf2D = isHirf2D;
    }

    bool QTextReader::doRead(QString& error)
    {
        m_allData.clear();

        QFile file(m_filePath);
        if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
        {
            error = "无法打开文件: " + m_filePath;
            return false;
        }

        QTextStream in(&file);

        bool firstLine = true;
        while (!in.atEnd())
        {
            QString line = in.readLine().trimmed();
            //auto regLine = processLine(line);
            QStringList values = line.split(m_splitter);

            if (m_hasHeader)
            {
                if (firstLine)
                {
                    for (int i = 0; i < values.size(); i++)
                    {
                        m_headers << values[i];
                    }
                    m_allData.resize(values.size()); // 根据列数调整 QVector 的大小  
                    firstLine = false;
                }
                else
                {
                    // 逐列将数据转换为 double 并存储  
                    for (int i = 0; i < values.size(); ++i)
                    {
                        bool ok;
                        double value = values[i].toDouble(&ok);
                        if (ok)
                        {
                            m_allData[i].second.append(value);
                        }
                        else {
                            // 处理无效值，可以选择记录错误或跳过  
                            error = "无效的数值: " + values[i];
                            return false;
                        }
                    }
                }
            }
            else
            {
                if (firstLine)
                {
                    for (int i = 0; i < values.size(); i++)
                    {
                        if (i == 0)
                        {
                            m_headers << "X";
                        }
                        else
                        {
                            m_headers << "Y" + QString::number(i);
                        }
                    }
                    m_allData.resize(values.size()); // 根据列数调整 QVector 的大小  
                    firstLine = false;
                }
                // 逐列将数据转换为 double 并存储  
                for (int i = 0; i < values.size(); ++i)
                {
                    bool ok;
                    double value = values[i].toDouble(&ok);
                    if (ok)
                    {
                        m_allData[i].second.append(value);
                    }
                    else {
                        // 处理无效值，可以选择记录错误或跳过  
                        error = "无效的数值: " + values[i];
                        return false;
                    }
                }

            }

            if (m_allData.size() != m_headers.size())
            {
                error = "列数不匹配";
                return false;
            }
            for (int i = 0; i < m_allData.size(); ++i)
            {
                m_allData[i].first = m_headers[i];
            }
        }

        file.close();
        return true;
    }

}
